João Távora [Thu, 10 May 2018 19:00:15 +0000 (20:00 +0100)]
Friendlier m-x eglot
* eglot.el (eglot-server-programs): Renamed from eglot-executables
(eglot--interactive): Redesign
(eglot): Docstring.
(eglot--connect): Now a synchronous gig.
(eglot--interactive): Friendlier.
(eglot): Improve docstring, rework a bit.
(eglot-reconnect): Rework a bit.
(eglot--process-sentinel): Insert "byebye" ruler here.
* README.md: Update
João Távora [Thu, 10 May 2018 18:23:56 +0000 (19:23 +0100)]
Improve eglot-eldoc-function
Use the :range key if the server provided it. Also simplify code with
a new eglot--with-lsp-range macro.
* eglot.el (eglot--format-markup): Tweak comment.
(eglot--with-lsp-range): New helper macro.
(eglot--server-textDocument/publishDiagnostics)
(eglot--apply-text-edits): Use it.
(eglot-eldoc-function): Use range if server provides it.
João Távora [Thu, 10 May 2018 17:44:47 +0000 (18:44 +0100)]
Reduce log chatter
* eglot.el (eglot--process-sentinel, eglot--request): Use
eglot--log-event.
(eglot--log-event): Print "message" if type unknown.
(eglot--debug, eglot--log): Remove.
(eglot--server-window/logMessage, eglot--server-telemetry/event):
Make noops.
(eglot--call-deferred): Also reduce chatter here.
João Távora [Thu, 10 May 2018 12:52:21 +0000 (13:52 +0100)]
Only call deferred actions after a full message has been received
Otherwise it can be quite wasteful.
* eglot.el (eglot--process-filter): Don't eglot--call-deferred here.
(eglot--process-receive): Do it here.
João Távora [Thu, 10 May 2018 12:14:19 +0000 (13:14 +0100)]
Resist server failure during synchronous requests
Calling the error handler unprotected could lead to the rest of the
sentinel not running at all. This defeated the auto-reconnection in
Rust, for example.
* eglot.el (eglot--process-sentinel): Rework.
João Távora [Thu, 10 May 2018 11:54:35 +0000 (12:54 +0100)]
Simplify mode-line updating logic
* eglot.el (eglot--define-process-var): Simplify.
(eglot--short-name, eglot--spinner, eglot--status): Don't
auto-update mode-line.
(eglot--process-receive): Update it here.
João Távora [Thu, 10 May 2018 11:51:21 +0000 (12:51 +0100)]
More rls-specifics: update flymake diags when indexing done
RLS could/should report diagnostics for every opened file, even if
there aren't any problems. Because it doesn't, loop for every buffer
managed by the process and call eglot--current-flymake-report-fn
* eglot.el
(eglot--server-window/progress): Call eglot--current-flymake-report-fn
João Távora [Thu, 10 May 2018 11:21:29 +0000 (12:21 +0100)]
Adjust flymake integration
When opening a new file (signalling textDocument/didOpen) it makes
sense to call the flymake callback (if it exists) with no diagnostics,
just to get rid of that "Wait", since we don't know if later in this
callback cycle the server will ever report new diagnostics.
* eglot.el (eglot--managed-mode): Don't call flymake-mode or eldoc-mode
(eglot--managed-mode-hook): Add them here.
(eglot--maybe-activate-editing-mode): Call flymake callback.
(eglot--server-textDocument/publishDiagnostics): Set unreported
diagnostics to nil if invoking callback.
João Távora [Thu, 10 May 2018 11:07:31 +0000 (12:07 +0100)]
Shorten summary line to appease package-lint.el
João Távora [Thu, 10 May 2018 11:07:11 +0000 (12:07 +0100)]
More correctly setup rust-mode-related autoloads
By autoloading the add-hook form and the eglot--setup-rls-idiosyncrasies
definition, a user can start rust-mode without loading eglot.el along
with it.
* eglot.el (rust-mode-hook)
(eglot--setup-rls-idiosyncrasies): Wrap in autoloaded progn.
João Távora [Wed, 9 May 2018 22:24:15 +0000 (23:24 +0100)]
Add minimal headers, commentary and autoloads
João Távora [Wed, 9 May 2018 22:12:19 +0000 (23:12 +0100)]
Fancier rls spinner
* eglot.el (eglot--mode-line-format): Use (nth 3) of
eglot--spinner.
(eglot--server-window/progress): Save detail message in spinner.
João Távora [Wed, 9 May 2018 21:41:37 +0000 (22:41 +0100)]
New "deferred requests" that wait until server is ready
Calling textDocument/hover or textDocument/documentHighlight before
the server has had a chance to process a textDocument/didChange is
normally useless. The matter is worse for servers like RLS which only
become ready much later and send a special notif for it (see
https://github.com/rust-lang-nursery/rls/issues/725).
So, keeping the same coding style add a DEFERRED arg to eglot--request
that makes it maybe not run the function immediately. Add a bunch of
logic for probing readiness of servers.
* README.md: Update
* eglot.el (eglot--deferred-actions): New process-local var.
(eglot--process-filter): Call deferred actions.
(eglot--request): Rewrite.
(eglot--sync-request): Rewrite.
(eglot--call-deferred, eglot--ready-predicates)
(eglot--server-ready-p): New helpers.
(eglot--signal-textDocument/didChange): Set spinner and call
deferred actions.
(eglot-completion-at-point): Pass DEFERRED to eglot-sync-request.
(eglot-eldoc-function): Pass DEFERRED to eglot-request
(eglot--rls-probably-ready-for-p): New helper.
(rust-mode-hook): Add eglot--setup-rls-idiosyncrasies
(eglot--setup-rls-idiosyncrasies): New helper.
João Távora [Wed, 9 May 2018 21:28:29 +0000 (22:28 +0100)]
Call eglot-eldoc-function after completion finishes
* eglot.el (eglot-completion-at-point): Call
eglot-eldoc-function after completion finishes.
João Távora [Wed, 9 May 2018 21:26:02 +0000 (22:26 +0100)]
Simplify `eglot-shutdown`
* eglot.el (eglot, eglot-reconnect)
(eglot--managed-mode): Call new eglot-shutdown.
(eglot-shutdown): Simplify.
(eglot--process-sentinel): Also call error functions.
(eglot--process-filter): Reindent.
João Távora [Wed, 9 May 2018 11:24:10 +0000 (12:24 +0100)]
Get rid of eglot-mode
* eglot.el (eglot--managed-mode): Don't call eglot-mode. When
shutting down, offer to kill server.
(mode-line-misc-info): Update to use eglot--managed-mode
João Távora [Wed, 9 May 2018 09:58:28 +0000 (10:58 +0100)]
Simplify eglot--signal-textdocument/didchange
* eglot.el (eglot--recent-before-changes)
(eglot--recent-after-changes): Delete.
(eglot--recent-changes): New var.
(eglot--outstanding-edits-p, eglot--before-change)
(eglot--after-change): Rewrite.
(eglot--signal-textDocument/didChange): Rewrite.
(eglot--signal-textDocument/didOpen): Initialize
buffer-local eglot--recent-changes here.
João Távora [Wed, 9 May 2018 01:43:47 +0000 (02:43 +0100)]
Fix odd bugs and tweak stuff
* eglot.el (eglot--log-event): Insert before markers.
(eglot--process-receive): Shave lines.
(xref-backend-references): Use cl-return-from.
(eglot--log-event): Simplify
(eglot-completion-at-point): Saner annotation
João Távora [Tue, 8 May 2018 15:07:07 +0000 (16:07 +0100)]
Support workspace/applyedit
* eglot.el (eglot--reply): Don't send result or error if not
provided.
(eglot--server-workspace/applyEdit): New server method.
(eglot--apply-text-edits): Rework.
(eglot--apply-workspace-edit): New helper.
(eglot-rename): Simplify.
João Távora [Tue, 8 May 2018 12:37:35 +0000 (13:37 +0100)]
Support textdocument/rename
* README.md: Mention rename support.
* eglot.el (eglot--uri-to-path): Handle uri hidden in keywords.
(eglot--apply-text-edits): New helper.
(eglot-rename): New interactive command.
(eglot--client-capabilities): Add rename capability.
João Távora [Tue, 8 May 2018 10:38:02 +0000 (11:38 +0100)]
Reasonable textdocument/documenthighlight support
* README.md: Update.
* eglot.el (eglot--current-buffer-TextDocumentPositionParams): New
helper.
(xref-backend-identifier-completion-table): Refactor a bit.
(xref-backend-identifier-at-point): Use when-let and
eglot--current-buffer-TextDocumentPositionParams
(xref-backend-definitions, xref-backend-references): Refactor a
bit.
(eglot-completion-at-point): Use
eglot--current-buffer-TextDocumentPositionParams
(eglot-eldoc-function): Rewrite to handle
textDocument/documentHighlight.
(eglot--highlights): New variable.
(eglot--client-capabilities): Update with support for documentHighlight.
João Távora [Tue, 8 May 2018 01:05:03 +0000 (02:05 +0100)]
Fix odd bugs
* eglot.el (eglot--process-receive, eglot--request): Set status to
actual error message.
(eglot--managed-mode): Manage imenu-create-index-function
correctly.
(eglot--mode-line-format): Print error status.
João Távora [Tue, 8 May 2018 00:52:27 +0000 (01:52 +0100)]
When killing server, always wait 3 seconds
* eglot.el (eglot--request): Accept TIMEOUT param.
João Távora [Tue, 8 May 2018 00:46:30 +0000 (01:46 +0100)]
Try to fix some textdocument/completion bugs
* eglot.el (eglot-completion-at-point): Rework slightly.
João Távora [Mon, 7 May 2018 22:43:03 +0000 (23:43 +0100)]
Half-decent imenu support via textdocument/documentsymbol
* README.md: Update capability
* eglot.el (eglot--lsp-position-to-point): New function.
(eglot--managed-mode): Handle imenu-create-index-function.
(eglot--server-textDocument/publishDiagnostics): Use
eglot--lsp-position-to-point.
(eglot-imenu): New function.
(eglot--client-capabilities): Capable of documentSymbol.
João Távora [Mon, 7 May 2018 21:56:20 +0000 (22:56 +0100)]
Only request stuff that server says it's capable of
* eglot.el (eglot--server-capable): New helper.
(eglot-xref-backend)
(xref-backend-identifier-completion-table)
(xref-backend-references, xref-backend-apropos)
(eglot-completion-at-point, eglot-eldoc-function): Use it.
João Távora [Mon, 7 May 2018 21:40:53 +0000 (22:40 +0100)]
Simplify mode-line code with a helper.
* eglot.el (eglot--mdoe-line-props): New helper.
(eglot--mode-line-format): Use it.
João Távora [Mon, 7 May 2018 21:16:28 +0000 (22:16 +0100)]
Get rid of eglot--buffer-open-count
Hasn't really proved useful yet.
* eglot.el (eglot--buffer-open-count): Remove.
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Simplify.
João Távora [Mon, 7 May 2018 21:15:21 +0000 (22:15 +0100)]
Get rid of eglot--special-buffer-process
Hasn't really proved useful yet.
* eglot.el (eglot--special-buffer-process): Delete.
(eglot--current-process): Simplify.
(eglot--events-buffer): Simplify.
João Távora [Mon, 7 May 2018 21:14:06 +0000 (22:14 +0100)]
* eglot.el: reformat to shave off some lines.
João Távora [Mon, 7 May 2018 21:06:49 +0000 (22:06 +0100)]
Fix bug in hover support
* eldoc.el (eglot-eldoc-function): Use eglot--format-markup.
(subr-x): Require it.
(eglot--format-markup): Pacify byte-compiler.
João Távora [Mon, 7 May 2018 17:46:28 +0000 (18:46 +0100)]
Clean up client capabilities
* eglot.el (eglot--client-capabilities): Clean up client
capabilities.
João Távora [Mon, 7 May 2018 17:45:57 +0000 (18:45 +0100)]
Half-baked textdocument/hover support
* eglot.el (eglot--format-markup): New helper.
(eglot--managed-mode): Handle eldoc-documentation-function.
(eglot-eldoc-function): New function.
* README.md: update
João Távora [Mon, 7 May 2018 17:43:30 +0000 (18:43 +0100)]
Tweak the async request engine.
* eglot.el (eglot--request): Return the continuation id.
(eglot--lambda): Move up in the file.
(eglot--sync-request): Use a catch-tag.
João Távora [Mon, 7 May 2018 16:27:01 +0000 (17:27 +0100)]
Explain why didopen on after-revert-hook is a bad idea
The reason is that the global find-file-hook is called again, and that
already does the didOpen. Too many didOpen's would be bad.
* eglot.el (eglot--managed-mode): Remove commented lines.
João Távora [Mon, 7 May 2018 16:23:27 +0000 (17:23 +0100)]
Half-decent completion support
* README.md: Update.
* eglot.el (eglot--kind-names): New variable.
(eglot--managed-mode): Handle completion-at-point-functions.
(eglot-completion-at-point): New function.
João Távora [Mon, 7 May 2018 15:32:23 +0000 (16:32 +0100)]
Solve another textdocument/didchange bug
* eglot.el (eglot--signal-textDocument/didChange): Rework a bit.
(eglot--after-change): Store the actual after-text in the
eglot--recent-after-changes.
João Távora [Mon, 7 May 2018 14:04:02 +0000 (15:04 +0100)]
Support javascript's javascript-typescript-langserver
* README.md: Improve a bit
* eglot.el (eglot--make-process): Take MANAGED-MAJOR-MODE arg
(eglot-executables): Add basic javascript support.
(eglot--connect): Pass mode to eglot--make-process
(eglot--interactive): Check that guessed command is a listp.
(eglot): Minor improvement to message.
(eglot--current-buffer-TextDocumentItem): Guess language from mode
symbol.
João Távora [Mon, 7 May 2018 12:45:10 +0000 (13:45 +0100)]
Increase request timeout length to 10 seconds
* eglot.el (eglot-request-timeout): New var.
(eglot--request): Use it.
João Távora [Mon, 7 May 2018 12:42:56 +0000 (13:42 +0100)]
Workaround two suspected emacs bugs
* eglot.el (eglot--process-filter): Use a proper unique tag. Use
unwind-protect.
(eglot--sync-request): Rework.
(eglot--server-client/registerCapability): Use a proper done tag.
João Távora [Mon, 7 May 2018 11:18:08 +0000 (12:18 +0100)]
Etoomanylambdas
* eglot.el (eglot--sync-request): Remove a lambda.
João Távora [Mon, 7 May 2018 10:53:44 +0000 (11:53 +0100)]
Fix the odd bug here and there
* eglot.el (eglot--connect): Activate editing mode where
applicable here.
(eglot, eglot-reconnect): Not here or here.
(eglot--process-sentinel): Catch auto-reconnect errors.
(eglot--notify): Dont send 'id=null', it messes up js's lsp
(eglot--reply): Do send id here.
(eglot--log-event): Simplify protocol. Complexify implementation.
(eglot--process-receive, eglot--process-send): Simplify
eglot--log-event call.
(eglot--request, eglot--notify, eglot--reply): Simplify
eglot--process-send call
(eglot--server-client/registerCapability): Fix bug when replying
with wrong id.
(eglot--xref-reset-known-symbols): Take DUMMY arg.
João Távora [Sat, 5 May 2018 10:26:12 +0000 (11:26 +0100)]
Half-decent xref support
* eglot.el
(eglot--xref-known-symbols): New hacky var.
(eglot--xref-reset-known-symbols): New helper.
(xref-find-definitions, xref-find-references): Advise after to
call the new helper.
(xref-backend-identifier-completion-table): Rework.
(eglot--xref-make): New helper.
(xref-backend-definitions): Use it.
(xref-backend-references, xref-backend-apropos): Implement.
(eglot--obj): Add a debug spec.
(eglot--lambda): Add debug spec.
João Távora [Sat, 5 May 2018 01:29:06 +0000 (02:29 +0100)]
Very basic xref support
* eglot.el (eglot--pos-to-lisp-position): Move up.
(eglot--mapply, eglot--lambda): New helpers.
(eglot--uri-to-path): New helper.
(eglot--managed-mode): Manage xref-backend-functions.
(eglot-xref-backend): New function.
(xref-backend-identifier-completion-table)
(xref-backend-identifier-at-point)
(xref-backend-definitions): New methods.
(xref-backend-references)
(xref-backend-apropos): New methods, still unimplemented.
João Távora [Sat, 5 May 2018 01:16:10 +0000 (02:16 +0100)]
New helper eglot--sync-request
This should help with xref definitions
* eglot.el (eglot--request): Rework a bit. Continuation is always
cleared on timeout, regardless of user-supplied fn.
(eglot--sync-request): New function.
(eglot--process-receive): watch out for vector results.
João Távora [Sat, 5 May 2018 01:24:37 +0000 (02:24 +0100)]
Cleanup mistake with textdocumentitem and textdocumentidentifier
Also introduce eglot--path-to-uri
* eglot.el (eglot--path-to-uri): Rename from eglot--uri and rework.
(eglot--connect): Use it.
(eglot--current-buffer-TextDocumentIdentifier): New function.
(eglot--current-buffer-VersionedTextDocumentIdentifier)
(eglot--signal-textDocument/didChange)
(eglot--signal-textDocument/didClose)
(eglot--signal-textDocument/willSave)
(eglot--signal-textDocument/didSave): Use it.
João Távora [Fri, 4 May 2018 14:19:19 +0000 (15:19 +0100)]
Handle dynamic registration in general (but nothing specific yet)
* eglot.el (eglot--server-client/registerCapability): Implement.
(eglot--register-workspace/didChangeWatchedFiles): Dummy registrator.
João Távora [Fri, 4 May 2018 14:02:03 +0000 (15:02 +0100)]
Honour textdocumentsync
* eglot.el (eglot--signal-textDocument/didChange): Honour textDocumentSync
João Távora [Fri, 4 May 2018 13:42:02 +0000 (14:42 +0100)]
Be quite explicit about our lack of capabilities right now
* eglot.el (eglot--client-capabilities): Spread out.
João Távora [Fri, 4 May 2018 13:29:40 +0000 (14:29 +0100)]
Use rooturi instead of rootpath
* eglot.el (eglot--connect)
(eglot--current-buffer-VersionedTextDocumentIdentifier): Use
eglot--uri.
(eglot--uri): New function.
João Távora [Fri, 4 May 2018 13:18:12 +0000 (14:18 +0100)]
Make reported capabilities into its own function
* eglot.el (eglot--client-capabilities): New function.
(eglot--connect): Use it.
João Távora [Fri, 4 May 2018 13:15:41 +0000 (14:15 +0100)]
Include source info in diagnostics
* eglot.el (eglot--server-textDocument/publishDiagnostics):
Include source info.
João Távora [Fri, 4 May 2018 12:36:33 +0000 (13:36 +0100)]
Reply to client/registercapability (don't handle it yet)
* eglot.el (eglot--server-client/registerCapability): New
function.
João Távora [Fri, 4 May 2018 11:17:26 +0000 (12:17 +0100)]
Handle requests from server correctly
* eglot.el (eglot--process-receive): Redesign.
(eglot--process-send): Take REPLY arg. Discover if message is error.
(eglot--reply): new function
(eglot--log-event): Tweak docstring.
(eglot--process-receive): Reply with -32601 if unimplemented.
(eglot--server-window/showMessageRequest)
(eglot--server-client/registerCapability): Use eglot--reply
João Távora [Fri, 4 May 2018 11:03:51 +0000 (12:03 +0100)]
Don't auto-reconnect if last attempt lasted less than 3 seconds
* eglot.el (eglot--inhibit-auto-reconnect): New var.
(eglot--process-sentinel): Use it.
João Távora [Fri, 4 May 2018 10:54:06 +0000 (11:54 +0100)]
Workaround rls's regusal to treat nil as empty json object
* eglot.el (eglot--connect): Use dummy params.
João Távora [Fri, 4 May 2018 09:49:34 +0000 (10:49 +0100)]
Eglot-editing-mode becomes eglot--managed-mode
* eglot.el (eglot--sentinel): Use eglot--managed-mode.
(eglot--managed-mode-map): Renamed from eglot-editing-mode-map.
(eglot--managed-mode): Renamed from eglot-editing-mode.
(eglot-mode): Simplify.
(eglot--buffer-managed-p): New function.
(eglot--maybe-activate-editing-mode): Simplify.
João Távora [Fri, 4 May 2018 09:47:17 +0000 (10:47 +0100)]
Make m-x eglot's interactive spec a separate function
* eglot.el (eglot--interactive): New function.
(eglot): Rework a little.
João Távora [Fri, 4 May 2018 00:25:13 +0000 (01:25 +0100)]
When user declines to reconnect, first quit existing server
* eglot.el (eglot): Rework reconnection logic.
João Távora [Fri, 4 May 2018 10:21:11 +0000 (11:21 +0100)]
Connect to lsp server via tcp
* eglot.el (eglot--make-process): Rename from
eglot-make-local-process.
(eglot): Fix docstring and rework.
(eglot--bootstrap-fn): Remove
(eglot--contact): New process-local var.
(eglot--connect): Take CONTACT arg.
(eglot--reconnect): Rework.
João Távora [Fri, 4 May 2018 00:20:13 +0000 (01:20 +0100)]
More correctly keep track of didopen/didclose per buffer
* eglot.el (eglot--buffer-open-count): Now a process-local var.
(eglot--signal-textDocument/didOpen, eglot--signal-textDocument/didClose):
Use it.
João Távora [Thu, 3 May 2018 23:25:03 +0000 (00:25 +0100)]
Fix mode-line mouse-clicks from outside selected window
* eglot.el (eglot--mode-line-call): New helper.
(eglot--mode-line-format): Use it.
João Távora [Thu, 3 May 2018 23:12:53 +0000 (00:12 +0100)]
* eglot.el (eglot--process-receive): skip null method notifs.
João Távora [Thu, 3 May 2018 22:59:56 +0000 (23:59 +0100)]
Trim some edges and add a bunch of boring rpc methods
* eglot.el (eglot--connect): Don't call eglot--protocol-initialize.
(eglot--process-filter): Break long line.
(eglot--process-receive): Also pass id to handler if a server request.
(eglot--log): New helper.
(eglot-editing-mode): Manage before-revert-hook,
after-revert-hook, before-save-hook, after-save-hook.
(eglot--protocol-initialize): Removed.
(eglot--server-window/showMessage): Simplify.
(eglot--server-window/showMessageRequest)
(eglot--server-window/logMessage, eglot--server-telemetry/event):
New handlers.
(eglot--signal-textDocument/willSave)
(eglot--signal-textDocument/didSave): New notifications.
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Check
eglot--buffer-open-count.
(eglot--buffer-open-count): New var.
João Távora [Thu, 3 May 2018 21:44:13 +0000 (22:44 +0100)]
Fix a couple of rust-related edge cases
* eglot.el (eglot--server-window/progress): Allow other keys.
(eglot--server-textDocument/publishDiagnostics): Allow :group in diagnostic
spec.
João Távora [Thu, 3 May 2018 21:42:13 +0000 (22:42 +0100)]
Fix textdocument/didchange
* eglot.el (eglot-editing-mode): Manage before-change-functions.
(eglot--recent-changes): Deleted.
(eglot--recent-before-changes): New var.
(eglot--recent-after-changes): Renamed from eglot--recent-changes.
(eglot--pos-to-lsp-position, eglot--before-change): New helpers.
(eglot--after-change): Rework.
(eglot--signal-textDocument/didChange): Rework.
João Távora [Thu, 3 May 2018 15:14:35 +0000 (16:14 +0100)]
Rename rpc methods for clarity
* eglot.el (eglot--process-receive): Search for RPC server methods
under `eglot--server-'
(eglot-editing-mode, eglot--maybe-activate-editing-mode): Use new
signal names.
(eglot--server-window/showMessage): Rename from
eglot--window/showMessage.
(eglot--server-textDocument/publishDiagnostics): Renamed from
eglot--textDocument/publishDiagnostics.
(eglot--current-buffer-versioned-identifier): Remove.
(eglot--current-buffer-VersionedTextDocumentIdentifier): Use
eglot--versioned-identifier.
(eglot--signal-textDocument/didChange): Renamed from
eglot--maybe-signal-didChange.
(eglot--signal-textDocument/didOpen): Renamed from
eglot--signalDidOpen.
(eglot--signal-textDocument/didClose): Rename from
eglot--signalDidClose.
(eglot-flymake-backend): Call eglot--signal-textDocument/didChange.
(eglot--server-window/progress): Rename from
eglot--window/progress.
João Távora [Thu, 3 May 2018 15:04:03 +0000 (16:04 +0100)]
Reorganize file
* eglot.el (eglot-mode-line): Move up.
(eglot-make-local-process, eglot--all-major-modes, eglot--obj)
(eglot--project-short-name, eglot--all-major-modes)
(eglot-reconnect, eglot--maybe-activate-editing-mode)
(eglot--protocol-initialize)
(eglot--window/showMessage, eglot--current-flymake-report-fn)
(eglot--unreported-diagnostics)
(eglot--textDocument/publishDiagnostics, eglot--signalDidOpen)
(eglot--signalDidClose): Move around.
(eglot-quit-server): Renamed to eglot-shutdown.
(eglot-shutdown): New function
João Távora [Thu, 3 May 2018 14:47:39 +0000 (15:47 +0100)]
Delete two useless forward declarations
* eglot.el (eglot-mode, eglot-editing-mode-map): Remove forward decls.
João Távora [Thu, 3 May 2018 14:46:27 +0000 (15:46 +0100)]
Fix flymake diagnostic positions
It's better not to use flymake-diag-region here.
* eglot.el (eglot--textDocument/publishDiagnostics):
Calculate position by hand.
João Távora [Thu, 3 May 2018 14:45:30 +0000 (15:45 +0100)]
Must re-announce didopen after reconnect
* eglot.el (eglot-reconnect): Also call
eglot--maybe-activate-editing-mode for all buffers.
João Távora [Thu, 3 May 2018 14:10:32 +0000 (15:10 +0100)]
Fix another flymake sync bug
* eglot.el (eglot-flymake-backend): Only report unreported sometimes.
(eglot--maybe-activate-editing-mode): Start flymake explicitly
when didOpen.
(eglot--textDocument/publishDiagnostics): No need to set
unreported-diagnostics to nil.
(flymake): Require it.
João Távora [Thu, 3 May 2018 13:54:39 +0000 (14:54 +0100)]
Make m-x eglot the main entry point
* eglot.el (eglot-new-process): Removed
(eglot): Rename from eglot-new-process.
(eglot-editing-mode): Mention M-x eglot
* README.md: Use M-x eglot
João Távora [Thu, 3 May 2018 13:49:43 +0000 (14:49 +0100)]
Fix assorted bugs
* eglot.el (eglot--special-buffer-process): Must be buffer-local.
(eglot--define-process-var): Fix disaster waiting to happen.
(eglot--process-receive): Explicitly pass PROC to
eglot--pending-continuations.
(eglot--textDocument/publishDiagnostics): Clear unreported diagnostics
João Távora [Thu, 3 May 2018 13:08:37 +0000 (14:08 +0100)]
Watch for files opened under umbrella of existing process
* eglot.el (eglot--connect): Call success-fn with a proc.
(eglot-reconnect): Adapt to new eglot--connect.
(eglot-new-process): Call eglot--maybe-activate-editing-mode
(eglot--maybe-activate-editing-mode): New function.
(find-file-hook): Add it here.
João Távora [Thu, 3 May 2018 12:37:04 +0000 (13:37 +0100)]
Multiple servers per project are possible
A server manages a specific major-mode within a project.
* eglot.el (eglot--processes-by-project): Add docstring.
(eglot--current-process): Search new eglot--processes-by-project
format.
(eglot--major-mode): New variable.
(eglot--moribund, eglot--project): Update docstring.
(eglot--project-short-name, eglot--all-major-modes): New helpers.
(eglot--connect): Rework.
(eglot-new-process): Rework severely.
(eglot--command-history): New variable.
(eglot--process-sentinel): Use new
eglot--processes-by-project. Update mode line.
(eglot-editing-mode): Don't start processes, just suggest it.
João Távora [Thu, 3 May 2018 12:32:20 +0000 (13:32 +0100)]
Appease checkdoc.el
* eglot.el (eglot--process-send, eglot--next-request-id)
(eglot--current-buffer-VersionedTextDocumentIdentifier)
(eglot--current-buffer-TextDocumentItem)
(eglot--after-change, eglot--signalDidOpen)
(eglot--signalDidClose, eglot--maybe-signal-didChange):
Add docstring.
João Távora [Thu, 3 May 2018 11:05:37 +0000 (12:05 +0100)]
Simplify flymake integration
And get rid of the ridiculous environment thingy
* eglot.el (eglot--process-sentinel): Continuations are triplets.
(eglot--environment-vars, eglot--environment): Remove.
(eglot--process-receive): Simplify.
(eglot--unreported-diagnostics): New variable.
(eglot--textDocument/publishDiagnostics): Simplify.
(eglot-flymake-backend): Report unreported diagnostics.
João Távora [Thu, 3 May 2018 10:49:24 +0000 (11:49 +0100)]
Signal textdocument/didclose
* eglot.el (eglot-editing-mode): Signal didClose.
(eglot--signalDidClose): New.
João Távora [Thu, 3 May 2018 10:48:35 +0000 (11:48 +0100)]
Rework connection restarting again
Quitting a process removes it from the project.
* eglot.el (eglot-editing-mode,eglot-mode): Forward declare.
(eglot--project): New process-local var.
(eglot--connect): Takes a project.
(eglot-new-process): Rework.
(eglot--sentinel): Remove proc from eglot--processes-by-project.
João Távora [Thu, 3 May 2018 10:39:49 +0000 (11:39 +0100)]
Redesign and simplify parser
Fix horrible bugs. This is the correct way.
* eglot.el (eglot--process-filter): Redesign.
João Távora [Wed, 2 May 2018 16:00:46 +0000 (17:00 +0100)]
Auto-reconnect on unexpected connection loss
* eglot.el (eglot-reconnect): Only quit if indeed not quit
already.
(eglot-new-process): Burn the command in the bootstrap fn.
(eglot--process-sentinel): Automatically reconnect if closed
unexpectedly.
(eglot--warn): Also message to *Messages*
João Távora [Wed, 2 May 2018 14:49:41 +0000 (15:49 +0100)]
Ready to start fixing flymake integration
* eglot.el (eglot-editing-mode): Turn on flymake-mode.
(eglot-flymake-backend): Always start by reporting no diagnostics.
(eglot--textDocument/publishDiagnostics): No annoying message.
João Távora [Wed, 2 May 2018 14:36:26 +0000 (15:36 +0100)]
Slightly more user friendly start
* eglot.el (eglot-new-process): signal DidOpen for every file in project.
(eglot-editing-mode): Offer to start process.
João Távora [Wed, 2 May 2018 14:35:22 +0000 (15:35 +0100)]
Don't clutter ui with warnings
* eglot.el (warnings): require it.
(eglot--warn): set warning-minimum-level
João Távora [Wed, 2 May 2018 14:06:50 +0000 (15:06 +0100)]
Rework commands for connecting and reconnecting
* eglot.el (eglot--current-process-or-lose): Add doc.
(eglot--command): Remove.
(eglot--bootstrap-fn): New process-local variable.
(eglot--connect): Redesign.
(eglot-make-local-process): New function.
(eglot-reconnect): New interactive command.
(eglot-new-process): Redesign.
(eglot--process-sentinel): Add doc.
(eglot--protocol-initialize): Rework.
(eglot--mode-line-format): Use eglot-reconnect.
João Távora [Wed, 2 May 2018 12:54:37 +0000 (13:54 +0100)]
Less obstrusive flymake stuff for now
* eglot.el (eglot--after-change, eglot-flymake-backend): Fix.
João Távora [Wed, 2 May 2018 12:37:35 +0000 (13:37 +0100)]
Events buffer uses eglot-mode, source buffers use eglot-editing-mode
* eglot.el (eglot--special-buffer-process): New var.
(eglot--current-process): Consider eglot--special-buffer-process.
(eglot-events-buffer): Use eglot-mode
(eglot-editing-mode): New minor mode.
(eglot-mode): Turns on eglot-editing-mode maybe.
João Távora [Wed, 2 May 2018 12:33:02 +0000 (13:33 +0100)]
Change status to error everytime an error is found
* eglot.el (eglot--process-receive): Also set error status.
(eglot--request): Fix a compilation warning.
João Távora [Wed, 2 May 2018 12:32:13 +0000 (13:32 +0100)]
Correctly report what we currently are capable of
Which is almost nothing.
* eglot.el (eglot--protocol-initialize): Clean up.
João Távora [Wed, 2 May 2018 12:31:26 +0000 (13:31 +0100)]
Add eglot-clear-status interactive command
* eglot.el (eglot-clear-status): New
(eglot-forget-pending-continuations): Fix bug.
(eglot--mode-line-format): Add link to eglot-clear-status.
João Távora [Wed, 2 May 2018 12:28:18 +0000 (13:28 +0100)]
Auto update mode-line after setting some process properties
* eglot.el (eglot--define-process-var): Rework.
(eglot--short-name, eglot--spinner, eglot--status): Update mode-line
after setting it.
João Távora [Wed, 2 May 2018 11:05:47 +0000 (12:05 +0100)]
Start experimenting with python
* eglot.el (eglot-executables): Add pyls.
João Távora [Wed, 2 May 2018 11:04:56 +0000 (12:04 +0100)]
Don't switch to possibly dead buffer in sentinel
* eglot.el (eglot--process-sentinel): Don't with-current-buffer.
João Távora [Tue, 1 May 2018 22:13:49 +0000 (23:13 +0100)]
Report server status in the mode-line
* eglot.el (eglot--status): New var.
(eglot--log-event): Try to be more useful for other stuff.
(eglot--protocol-initialize): Set status to nil on
successful connect.
(eglot--window/showMessage): Set status to error if needed.
(eglot--mode-line-format): Display status if serious.
João Távora [Tue, 1 May 2018 21:47:09 +0000 (22:47 +0100)]
Implement spinners and rls's window/progress
* eglot.el (eglot--window/progress): New.
(eglot--mode-line-format): Rework.
(eglot--snpinner): New var.
(compile): require it.
João Távora [Tue, 1 May 2018 21:30:09 +0000 (22:30 +0100)]
Fix parser to accept multiple messages in one chunk
* eglot.el (eglot--process-filter): Redesign slightly.
(eglot--message-mark): Remove. don't need this.
João Távora [Tue, 1 May 2018 09:46:06 +0000 (10:46 +0100)]
Lay groundwork for uniform treatment of network connections
* eglot.el (eglot--connect): New helper.
(eglot-new-process): Use it.
(pcase): Require it.
João Távora [Tue, 1 May 2018 09:18:31 +0000 (10:18 +0100)]
Doc fixes
* eglot.el (eglot-mode-map): Move up before minor mode.
João Távora [Tue, 1 May 2018 09:14:53 +0000 (10:14 +0100)]
* eglot.el (eglot-mode-map): move up before minor mode.